﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//
using CommonClass;
using EncryptProject;
using System.Diagnostics;
using RegistryLib;
using SoftKeyLib;
using SurveillanceLib;


namespace MatrixManagement
{
    public partial class frm_RegCode : Form
    {
        #region Const

        /// <summary>
        /// CPU | Disk | MendTime | MD5 | GUID
        /// </summary>
        private const string REGCODE = "{0} {1} {2} {3} {4}"; // 注：这里前面不能加"@"，否则无法换行

        #endregion

        #region 构造函数

        public frm_RegCode()
        {
            InitializeComponent();
        }

        #endregion

        #region 事件

        /// <summary>
        /// Form_Load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frm_RegCode_Load(object sender, EventArgs e)
        {
            #region 生成唯一机器码
            Utilities.GenerateMachineCode(); // 1. 重新计算机器码

            // 2. 判断数据库中的 MendTime 是否是时间值，若不为时间值，取当前时间并入库，这样数据库中只记录一次时间（目的：用户每次查看的 MD5 值相同！）
            DateTime outMendTime = DateTime.Now; // 记录补锁时间
            SurveillanceDAL dataOperation = new SurveillanceDAL(); // 操作数据库
            DataRow drSystem = null; // SystemInformation 表的信息【只含唯一一条记录】
            DataSet dsSystem = dataOperation.GetDataSet(
                    string.Format(SurveillanceDAL.QUERY_GET_ALLSYSTEMDATA_BYID, SurveillanceDAL.SYSTEM_GUID),
                    string.Empty, "db_VWMSConnectionString", string.Format("{0}.exe", Application.ProductName));

            if (dsSystem.Tables.Count > 0)
            {
                if (dsSystem.Tables[0].Rows.Count > 0) // 数据库中存在系统数据
                {
                    drSystem = dsSystem.Tables[0].Rows[0]; // 返回第一条记录，因表里只有一条数据
                    if (drSystem != null && drSystem[RegistryOperation.SUBKEYNAME_MENDTIME] != null &&
                        DateTime.TryParse(drSystem[RegistryOperation.SUBKEYNAME_MENDTIME].ToString(),
                            out outMendTime)) // 判断 MendTime 为时间值
                    {
#if DEBUG
                        Debug.WriteLine("数据库中 MendTime 为时间值！");
#endif
                    }
                    else
                    {
#if DEBUG
                        Debug.WriteLine("解析时间失败，设为当前时间值！");
#endif
                        outMendTime = DateTime.Now; // 获取当前时间
                        drSystem[RegistryOperation.SUBKEYNAME_MENDTIME] = outMendTime;
                        dataOperation.EditSystemItem(drSystem, dataOperation);
                    }
                }
                else
                {
                    drSystem = dsSystem.Tables[0].NewRow(); // 添加一个新数据行
                    drSystem[RegistryOperation.SUBKEYNAME_MENDTIME] = outMendTime;
                    dataOperation.EditSystemItem(drSystem, dataOperation);
                }
            }
            else
            {
#if DEBUG
                throw new DataException("数据库异常！");
#endif
            }

            // 3. 计算 MD5
            string companyMD5 = EncryptAlgorithmHelper.MD5Hash(string.Format(SoftKeyOperation.MD5_FORMAT_STYLE4COMPANY,
                Utilities.MachineCode, outMendTime, Utilities.ProjectGUID)); // MD5（对公司）

            // 4. 显示在文本框中
            SoftReg reg = new SoftReg();
            tbRegCode.Text = string.Format(REGCODE,
                reg.GetCPU(), reg.GetDiskVolunmeSerialNumber(),
                EncryptAlgorithmHelper.Encrypt(outMendTime.ToString()), companyMD5, Utilities.ProjectGUID);
            #endregion
        }

        /// <summary>
        /// 复制并退出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSaveAndClose_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(tbRegCode.Text))
                Clipboard.SetText(tbRegCode.Text); // 复制文本信息到剪贴板中

            this.Close(); // 关闭窗口
        }

        /// <summary>
        /// 单击文件框，即全选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbRegCode_Click(object sender, EventArgs e)
        {
            tbRegCode.SelectAll(); // 全选
            if (!string.IsNullOrWhiteSpace(tbRegCode.Text))
                Clipboard.SetText(tbRegCode.Text); // 复制文本信息到剪贴板中
        }

        /// <summary>
        /// 文本框内容改变时，即：有内容时按钮可用；反之亦然！
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbRegCode_TextChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(tbRegCode.Text))
                btnSaveAndClose.Enabled = false;
            else
                btnSaveAndClose.Enabled = true;
        }

        #endregion
    }
}
